package com.ihakul.logger;

import android.content.Context;

import java.util.logging.Level;
import java.util.logging.Logger;

import androidx.annotation.NonNull;

/**
 * 使用该类初始化 {@code ihakul-iot-parent} 工程的日志系统，默认工作模式为：日志显示级别为{@code INFO}
 * 及以上并记录到文件，目录位于 {@code storage/emulated/0/ihakul/logging} 下，连续追加，单个文件
 * 最大 {@code 500K}，最多保留最近的 {@code 5M} 记录。
 *
 * <blockquote>
 * 通过修改 {@link Configurator} 或 {@code resources/logging.properties} 可调整工作模式。
 * </blockquote>
 *
 * @author Aaron
 * @version 2.1
 * Create at 2019/7/15
 */
public interface LogBuilder {

    // - Please set the path where the log files are stored here, thank you -
    @NonNull String LOG_FILE_PATH="/ihakul";

    /**
     * 配置日志记录器的工作模式
     */
    void build();

    /**
     * 配置日志记录器的工作模式
     * @param tagName {@link Logger}的名称
     * @return 根据{@code tagName}返回一个{@link Logger}实例。
     */
    @NonNull Logger build(String tagName);


    /**
     * 配置{@link Logger}的工作模式接口
     */
    interface ILogger {

        /**
         * 让{@link Logger}使用当前的{@link Context}环境
         * @param context {@link Context}
         * @return {@link ILogger}
         */
        @NonNull IConfigure with(Context context);

        /**
         * 调整日志输出级别，不应频繁调整日志输出级别
         * @param level See {@link Level}
         */
        void setLevel(Level level);


    }

    interface IConfigure {
        /**
         * 将以{@code logging.properties}文件作为配置方案
         * @return {@link Enhanceable}
         */
        @NonNull Enhanceable useProperties();

        /**
         * 将{@link Configurator}类作为配置方案
         *
         * @return {@link Enhanceable}
         */
        @NonNull Enhanceable2 useConfiguration();

        /**
         * 释放日志系统
         */
        void freed();

    }

    interface Enhanceable extends LogBuilder {

        /**
         * 在这里配置处理日志内容的{@link SevereReporter}
         * @param reporter 由它将日志消息发送到主机
         */
        Enhanceable addReporter(@NonNull SevereReporter reporter);

        @NonNull
        LogBuilder openCrashedTracker();
    }

    interface Enhanceable2 extends Enhanceable{
        /**
         * 开启写入前缓存模式，启用后，日志数据将延迟定入到文件<br/><b/>
         * 适用于需要频繁记录日志数据的场景，可避免某些 {@code Android} 平台过度操作IO会引起栈中函数溢出的问题。</b>
         * @return
         */
        @NonNull Enhanceable openBuffering();
    }

}
